package com.sourcestruct.linearlist;

import lombok.ToString;

/**
 * @author: ZhouBert
 * @date: 2019/6/8
 * @description: 链式队列 入队和出队方向不同，需要由两个指针进行维护
 * 基于链表的队列是无限长的，一般不会要求无限长。——所以可能还是用数组好
 */
@ToString
public class LinkedQueue<T> {

	/**
	 * 假设这个为入队指针(用这个作为队列头会非常麻烦，因为出队不方便)
	 * ——假设这个为出队指针
	 */
	private LinkedList<T> head;
	/**
	 * 假设这个为出队指针(指向最后一个节点的前驱节点，这样方便操作) X
	 * ——得假设这个是入队指针
	 */
	private LinkedList<T> tail;

	/**
	 * 判断 tail 是否为末节点的前驱指针
	 */
	///private boolean isTailPrePoint;

	/**
	 * constructor
	 */
	public LinkedQueue() {
		head = null;
		///isTailPrePoint=false;

	}

	/**
	 * 入队，把新节点加入到尾指针
	 *
	 * @param obj
	 */
	public void queue(T obj) {
		if (head == null) {
			head = new LinkedList<>(obj);
			tail=head;
		} else {
			while (tail.getNext() != null) {
				tail = tail.getNext();
			}
			tail.setNext(new LinkedList<>(obj));
			tail = tail.getNext();
		}
	}

	/**
	 * 出队
	 * @return
	 */
	public T dequeue() {
		if (head == null) {
			throw new IllegalArgumentException("队列为空，无法出队！");
		}
		T result = head.getData();
		head = head.getNext();
		return result;
	}


	public static void main(String[] args) {
		LinkedQueue<Object> queue = new LinkedQueue<>();
		queue.queue(1);
		queue.queue(2);
		queue.queue(20);
		System.out.println(queue);
		System.out.println(queue.dequeue());
		System.out.println(queue);
		System.out.println(queue.dequeue());
		System.out.println(queue);
	}

	//region	原先头尾指针弄反了的麻烦做法
/**
 * 入队

 public void queue(T obj) {
 if (head == null) {
 head = new LinkedList<>(obj);
 } else {
 LinkedList node = new LinkedList(obj);
 node.setNext(head);
 head.setNext(node);
 }
 if (tail.getNext()!=null && tail.getNext().getNext()!=null){
 ///isTailPrePoint=true;
 }
 ///对于tail节点的判断就有点复杂了,每一次入队都需要判断一下
 while (tail.getNext() != null && tail.getNext().getNext() != null) {
 tail=tail.getNext();
 }
 }

 public T dequeue() {
 if (tail == null) {
 throw new IllegalArgumentException("队列为空！出队异常！");
 }
 LinkedList node = tail;
 ///当tail只有一个节点的时候，说明该节点就是末节点而非前驱
 if (isTailPrePoint){

 }
 }*/
	//endregion


}
